In questa parte della documentazione verranno riportati solo i diagrammi significativi. All'interno del progetto \`e possibile trovare tutti i diagrammi effettivamente creati e utilizzati durante la progettazione.

\section{Casi d'uso}
Per poter affrontare la progettazione del sistema si parte dai casi d'uso. Questa attivit\`a ha portato via molto tempo date le enormi discussioni da dover affrontare. Persone differenti gestiscono e affrontano le modlit\`a d'uso del sistema con approcci differenti, per poter coordinare lo sviluppo di un team \`e necessario esaurire le controversie il prima possibile.

\subsection{Requisiti}
\begin{description}
 \item[Requisiti Funzionali] (Functional Requirement) descrivono le funzionalit\`a ed i servizi forniti dal sistema.
 \item[Requisiti Non Funzionali] (Non Functional Requirement) non sono collegati direttamente con le funzioni implementate dal sistema, ma piuttosto alle modalit\`a operative, di gestione, ecc.. Definiscono vincoli sullo sviluppo del sistema
\end{description}

\subsection{Categorie}
\begin{description}
 \item[Essenziale] (1) Il sistema non pu\`o essere utilizzato senza questa feature. Sar\`a impossibile testarlo e documentarlo.
 \item[Atteso] (2) Gli stakeholders pi\`u importanti voglio e si aspettano la presenza di questa feature. Deve essergli promessa in una release, anche se non nella prima. La sua assenza determina il mancato successo del progetto.
 \item[Desiderato] (3) Gli stakeholders desiderano questa feature. La sua assenza riduce il successo del progetto.
 \item[Opzionale] (4) Questa feature sarebbe gradita. Aggiungerla permetterebbe di avere dei vantaggi, ma ritardarla non comprometterebbe il successo del progetto.
\end{description}

\subsection{Attori}
\begin{enumerate}
 \item Cliente
 \item Amministrazione
  \begin{enumerate}
   \item Amministratore privilegiato
  \end{enumerate}
 \item Sistema di pagamento
 \item Sistema di consegna
\end{enumerate}

\subsection{Descrizione casi d'uso - Prima iterazione}

\begin{center}
\begin{figure}
\includegraphics[width=\textwidth]{img/iterazione1UC.eps}
\caption{UC prima iterazione}
\end{figure}
\end{center}

\begin{description}
 \item[UC1] Registrazione utente
  \begin{description}
   \item[Obiettivo] Registrazione presso la libreria.
   \item[Categoria] Essenziale.
   \item[Attori] Cliente
   \item[Precondizioni] Essere un cliente non ancora autenticato.
   \item[Evento scatenante] Il cliente accede al servizio di registrazione.
   \item[Postcondizioni in caso di successo] Il cliente \`e registrato nel sistema.
   \item[Postcondizioni in caso di fallimento] Visualizzazione messaggio di errore.
   \item[Scenario principale di successo] : 
   \begin{enumerate}
    \item Il cliente inserisce i dati.
    \item Il cliente sceglie la password.
    \item Il sistema valida le informazioni obbligatorie e controlla l'unicit\`a dei dati identificativi del cliente. (Allegato)
    \item Il sistema notifica l'avvenuta registrazione al cliente.
   \end{enumerate}
   \item[Scenari alternativi]
   \item[Scenari eccezionali] : \\ 4E: Il sistema notifica la presenza di un errore nella validazione delle informazioni.
   \item[Estensioni allo scenario principale]
   \item[Requisiti non funzionali] Lo scambio dei dati avviene su canale protetto.
   \item[Vincoli temporali]
  \end{description}

 \item[UC2] Autenticazione
  \begin{description}
   \item[Obiettivo] Autenticazione presso il servizio.
   \item[Categoria] Essenziale
   \item[Attori] Cliente O Amministratore
   \item[Precondizioni] Essere un Cliente registrato O un Amministratore valido
   \item[Evento scatenante] Il cliente O l'amministratore accede al servizio di autenticazione. O Il sistema richiede l'autenticazione del cliente.
   \item[Postcondizioni in caso di successo] Il Cliente O l'amministratore risulta autenticato.
   \item[Postcondizioni in caso di fallimento] Visualizzazione di una pagina d'errore.
   \item[Scenario principale di successo] :
    \begin{enumerate}
     \item Il cliente O l'amministratore inserisce le sue credenziali.
     \item Il sistema verifica le credenziali dell'utente.
     \item Il sistema visualizza il messaggio relativo all'autenticazione avvenuta con successo.
    \end{enumerate}
   \item[Scenari alternativi]
   \item[Scenari eccezionali] : \\ 3E: Errore nell'autenticazione, credenziali non valide.
   \item[Estensioni allo scenario principale]
   \item[Requisiti non funzionali] Lo scambio dei dati avviene su canale protetto.
   \item[Vincoli temporali]
  \end{description}
 
 \item[UC3] Ricerca libri usando criteri di ricerca
 \begin{description}
  \item[Obiettivo] Cercare un libro all'interno del catalogo che corrisponda a dei criteri forniti dal cliente.
  \item[Categoria] Essenziale
  \item[Attori] Cliente
  \item[Precondizioni] Nessuna
  \item[Evento scatenante] Accede al servizio di ricerca.
  \item[Postcondizioni in caso di successo] La ricerca \`e stata eseguita correttamente mostrando la selezione dei testi corrispondenti ai criteri di ricerca (se il testo non \`e presente nel catalogo la selezione pu\`o essere vuota).
  \item[Postcondizioni in caso di fallimento] Visualizzazione di una pagina d'errore.
  \item[Scenario principale di successo] :
   \begin{enumerate}
    \item Il cliente immette i criteri di ricerca.
    \item Il sistema verifica la correttezza del formato dei dati.
    \item Il sistema compie la ricerca all'interno del catalogo.
    \item Il sistema visualizza la selezione dei libri trovati.
   \end{enumerate}
  \item[Scenari alternativi]
  \item[Scenari eccezionali] : \\ 3E: Il sistema notifica al cliente un errore nel formato dei dati immessi e il caso d'uso termina.
  \item[Estensioni allo scenario principale] : \\ 5: "Riorganizzazione della selezione (uc:7)"
  \item[Requisiti non funzionali]
  \item[Vincoli temporali]
 \end{description}

 \item[UC4] Acquisto libro
  \begin{description}
   \item[Obiettivo] Comprare uno o pi\`u libri presenti nel catalogo del negozio
   \item[Categoria] Essenziale
   \item[Attori] Cliente
   \item[Precondizioni] Cliente registrato con successo.
   \item[Evento scatenante]
   \item[Postcondizioni in caso di successo] Il cliente ha acquistato i libri e sono state avviate le procedure riguardanti la spedizione.
   \item[Postcondizioni in caso di fallimento]
   \item[Scenario principale di successo] :
    \begin{enumerate}
     \item INCLUDE "UC3 Ricerca libro usando criteri di ricerca"
     \item SE (la selezione non \`e vuota)
      \begin{enumerate}
       \item SE (il cliente non \`e autenticato) INCLUDE "UC2 Autenticazione"
       \item Il sistema aggiunge il libro al carrello.
       \item ALTRIMENTI il caso d'uso termina.
      \end{enumerate}
     \item FINCH\`E ( il cliente non \`e soddisfatto del carrello)
     \begin{enumerate}
      \item INCLUDE "UC3 Ricerca libro usando criteri di ricerca"
      \item SE (la selezione non \`e vuota)
       \begin{enumerate}
        \item SE (il cliente non \`e autenticato) INCLUDE "UC2 Autenticazione"
        \item Il sistema aggiunge il libro al carrello.
       \end{enumerate}
     \end{enumerate}
     \item SE (il carrello \`e vuoto) il caso d'uso termina.
     \item Il cliente compie il checkout del carrello.
     \item Il cliente convalida i dati relativi alla spedizione.
     \item Il cliente viene indirizzato al sistema di pagamento.
     \item INCLUDE "UC6 Convalida dell'ordine"
    \end{enumerate}
   \item[Scenari alternativi] : \\ 1alt: INCLUDE "UC8 Vetrina"
				\\ 3.(a)alt1: INCLUDE "UC8 Vetrina"
				\\ 3.(a)alt2: INCLUDE "UC5 Modifica del Carrello" vai al punto 5
   \item[Scenari eccezionali]
   \item[Estensioni allo scenario principale]
   \item[Requisiti non funzionali] :
    \begin{enumerate}
     \item Il numero di libri in magazzino deve essere sempre maggiore o uguale al numero dei libri prenotati.
     \item I libri presenti in un carrello non possono essere prenotati da altri.
    \end{enumerate}
   \item[Vincoli temporali] :
    \begin{enumerate}
     \item Ogni 30 min il carrello si svuota.
     \item Se dopo 30 min dall punto 6 non si riceve il messaggio che il pagamento \`e andato a buon fine, allora l'ordine viene annullato.
    \end{enumerate}
  \end{description}

 \item[UC5] Convalida ordini
  \begin{description}
   \item[Obiettivo] L'ordine risulta corretto e viene mandato al sistema di consegna.
   \item[Categoria] Essenziale
   \item[Attori] Sistema di pagamento E Sistema di consegna
   \item[Precondizioni] L'ordine non \`e vuoto e il cliente ha convalidato i dati relativi alla spedizione.
   \item[Evento scatenante] Ricezione messaggio da parte del sistema di pagamento.
   \item[Postcondizioni in caso di successo] Il pagamento \`e stato effettuato correttamente e l'ordine \`e stato mandato al sistema di consegna.
   \item[Postcondizioni in caso di fallimento] L'ordine \`e stato annullato, l'errore viene notificato al cliente e i libri sono nuovamente disponibili.
   \item[Scenario principale di successo] :
    \begin{enumerate}
     \item SE (il messaggio \`e affermativo)
      \begin{enumerate}
       \item L'ordine viene inviato al sistema di consegna.
       \item Il sistema chiude l'ordine.
       \item ALTRIMENTI L'ordine viene annullato e i testi vengono resi nuovamente disponibili.
      \end{enumerate}
    \end{enumerate}
   \item[Scenari alternativi]
   \item[Scenari eccezionali]
   \item[Estensioni allo scenario principale]
   \item[Requisiti non funzionali]
   \item[Vincoli temporali] Il sistema di pagamento invia certamente un messaggio entro 30 minuti.
  \end{description}
\end{description}

\subsection{Descrizione casi d'uso - Seconda iterazione}

\begin{center}
\begin{figure}
\includegraphics[width=\textwidth]{img/iterazione2UC.eps}
\caption{UC seconda iterazione}
\end{figure}
\end{center}

\begin{description}
 \item[UC6] Modifica del carrello
  \begin{description}
   \item[Obiettivo] Apportare modifche al proprio carrello
   \item[Categoria] Atteso
   \item[Attori] Cliente
   \item[Precondizioni] Il carrello non deve essere vuoto
   \item[Evento scatenante] Il cliente seleziona un libro nel carrello
   \item[Postcondizioni in caso di successo] Il contenuto del carrello \`e stato modificato correttamente
   \item[Postcondizioni in caso di fallimento] Il contenuto del carrello non \`e stato modificato
   \item[Scenario principale di successo] :
    \begin{enumerate}
     \item Il cliente indica il numero di copie desiderate del libro
     \item Il sistema verifica la disponibilit\`a delle copie
     \item Il sistema aggiorna il carrello con le modifche apportate dal cliente
    \end{enumerate}
   \item[Scenari alternativi] : \\ 1a: Il cliente elimina il libro dal carrello
   \item[Scenari eccezionali] : \\ 3E: Il nuovo numero di copie del libro non \`e disponibile; Il sistema notifica l'errore e segnala il numero massimo di copie disponibili
   \item[Estensioni allo scenario principale]
   \item[Requisiti non funzionali]
   \item[Vincoli temporali]
  \end{description}

 \item[UC7] Riorganizzazione della selezione
  \begin{description}
   \item[Obiettivo] Permettere al cliente di decidere l'ordine di visualizzione dei risultati
   \item[Categoria] Atteso
   \item[Attori] Cliente
   \item[Precondizioni] L'elenco dei risultati non deve essere vuoto
   \item[Evento scatenante] Il cliente seleziona un criterio di ordinamento
   \item[Postcondizioni in caso di successo] Il sistema visualizza lo stesso elenco di libri, ma con l'ordinamento scelto dal cliente
   \item[Postcondizioni in caso di fallimento] 
   \item[Scenario principale di successo] :
    \begin{enumerate}
     \item Il cliente seleziona un criterio di ordinamento
     \item Il sistema riorganizza i risultati e li visualizza
    \end{enumerate}
   \item[Scenari alternativi]
   \item[Scenari eccezionali]
   \item[Estensioni allo scenario principale]
   \item[Requisiti non funzionali]
   \item[Vincoli temporali]
  \end{description}

 \item[UC8] Ricerca libri usando la vetrina
  \begin{description}
   \item[Obiettivo] Cercare un libro tra quelli proposti dal sistema in vetrina
   \item[Categoria] Atteso
   \item[Attori] Cliente
   \item[Precondizioni]
   \item[Evento scatenante] Accesso al sistema di gestione dei libri della libreria
   \item[Postcondizioni in caso di successo] La vetrina viene visualizzata correttamente
   \item[Postcondizioni in caso di fallimento] La vetrina non viene visualizzata, il sistema mostra un messaggio d'errore
   \item[Scenario principale di successo] :
    \begin{enumerate}
     \item Il sistema mostra un elenco di libri consigliati
    \end{enumerate}
   \item[Scenari alternativi]
   \item[Scenari eccezionali]
   \item[Estensioni allo scenario principale] : \\ 2: "Riorganizzazione della selezione (uc:7)"
   \item[Requisiti non funzionali]
   \item[Vincoli temporali]
  \end{description}
\end{description}

\subsection{Descrizione casi d'uso - Terza iterazione}

\begin{center}
\begin{figure}
\includegraphics[width=\textwidth]{img/iterazione3UC.eps}
\caption{UC terza iterazione}
\end{figure}
\end{center}

\begin{description}
 \item[UC9] Aggiornamento catalogo
  \begin{description}
   \item[Obiettivo] Permette all'amministratore di aggiornare il catalogo dei libri in vendita
   \item[Categoria] Desiderato
   \item[Attori] Amministratore
   \item[Precondizioni]
   \item[Evento scatenante] L'amministratore accede al servizio di aggiornamento del catalogo
   \item[Postcondizioni in caso di successo] Il catalogo \`e stato aggiornato correttamente
   \item[Postcondizioni in caso di fallimento] Il catalogo non \`e stato aggiornato
   \item[Scenario principale di successo] :
    \begin{enumerate}
     \item INCLUDE "uc2: Autenticazione"
     \item FINCH\`E (le operazioni di aggiornamento non sono terminate)
      \begin{enumerate}
       \item L'amministratore aggiunge un libro al catalogo.
       \item Il sistema verifica la correttezza dell'operazione.
       \item Il sistema aggiorna il catalogo.
      \end{enumerate}
    \end{enumerate}
   \item[Scenari alternativi] : \\ 2.(a)alt1: L'amministratore rimuove un libro dal catalogo.
   				\\ 2.(a)alt2: L'amministratore modifica il numero di copie disponibili di un libro presente nel catalogo.
   				\\ 2.(a)alt3: L'amministratore modifica le informazioni relative a un libro presente nel catalogo.
   \item[Scenari eccezionali] : \\ 2.(c)E: Errore nell'aggiornamento del catalogo e segnalazione all'amministratore
   \item[Estensioni allo scenario principale]
   \item[Requisiti non funzionali]:
    \begin{itemize}
     \item Il catalogo viene mantenuto in memoria persistente
     \item Viene mantenuto il log delle operazioni
    \end{itemize}
   \item[Vincoli temporali]
  \end{description}

 \item[UC10] Gestione clienti
  \begin{description}
   \item[Obiettivo] Permette ad un amministratore di gestire lo stato dei clienti e quindi di bloccarli e sbloccarli in base alla necessit\`a
   \item[Categoria] Desiderato
   \item[Attori] Amministratore
   \item[Precondizioni]
   \item[Evento scatenante] Accesso alla sistema di gestione degli utenti
   \item[Postcondizioni in caso di successo] La lista degli utenti ha subito correttamente le modifiche volure dall'amministratore
   \item[Postcondizioni in caso di fallimento] Nessuna modifica apportata alla lista degli utenti
   \item[Scenario principale di successo] :
    \begin{enumerate}
     \item INCLUDE "uc2: Autenticazione"
     \item FINCH\`E (le operazioni di modifica non sono terminate)
      \begin{enumerate}
       \item L'amministratore seleziona un utente da sbloccare dalla lista.
       \item Il sistema verifica la correttezza dell'operazione.
       \item Il sistema aggiorna il la lista dei clienti.
      \end{enumerate}
    \end{enumerate}
   \item[Scenari alternativi] : \\ 2.(a)alt: L'amministratore seleziona un utente da bloccare dalla lista.
   \item[Scenari eccezionali] : \\ 2.(c)E: Il sistema notifica all'amministratore un errore nell'operazione.
   \item[Estensioni allo scenario principale]
   \item[Requisiti non funzionali]
   \item[Vincoli temporali]
  \end{description}

 \item[UC11] Modifica dati personali
  \begin{description}
   \item[Obiettivo] Permette ad un cliente registrato di controllare e modificare le informazioni personali
   \item[Categoria] Desiderato
   \item[Attori] Cliente
   \item[Precondizioni] Essere un cliente registrato
   \item[Evento scatenante] Il cliente accede al servizio di gestione dei dati personali
   \item[Postcondizioni in caso di successo] Le informazioni modificate dal cliente vengono apportate correttamente.
   \item[Postcondizioni in caso di fallimento]
   \item[Scenario principale di successo] :
    \begin{enumerate}
     \item INCLUDE "uc2: Autenticazione"
     \item FINCH\`E (il cliente non \`e soddisfatto delle informazioni contenute nel suo  profilo personale)
      \begin{enumerate}
       \item Il cliente immette una informazione da modificare.
       \item Il sistema verifica la correttezza del formato della nuova informazione.
       \item Il sistema aggiorna l'informazione sul profilo del cliente.
      \end{enumerate}
    \end{enumerate}
   \item[Scenari alternativi] : \\ 2.(a)alt.1: Il cliente seleziona una informazione da visualizzare.
   				\\ 2.(a)alt.2: Il sistema visualizza l'informazione selezionata. Vai al punto 2.
   \item[Scenari eccezionali] : \\ 2.(c)E: Il sistema notifica al cliente un errore nel formato dell'informazione immessa.
   \item[Estensioni allo scenario principale]
   \item[Requisiti non funzionali]
   \item[Vincoli temporali]
  \end{description}

 \item[UC12] Visualizzazione ordine
  \begin{description}
   \item[Obiettivo] Permette ad un cliente registrato di visualizzare le informazioni riguardanti i propri ordini
   \item[Categoria] Desiderato
   \item[Attori] Cliente
   \item[Precondizioni] Essere un cliente registrato
   \item[Evento scatenante] Il cliente accede al servizio di visualizzazione degli ordini personali
   \item[Postcondizioni in caso di successo] Le informazioni richieste dal cliente vengono visualizzate correttamente.
   \item[Postcondizioni in caso di fallimento]
   \item[Scenario principale di successo] :
    \begin{enumerate}
     \item INCLUDE "uc2: Autenticazione"
     \item FINCH\`E (il cliente non \`e soddisfatto delle informazioni visualizzate)
      \begin{enumerate}
       \item Il cliente seleziona un ordine da visualizzare.
       \item Il sistema visualizza l'informazione selezionata.
      \end{enumerate}
    \end{enumerate}
   \item[Scenari alternativi]
   \item[Scenari eccezionali]
   \item[Estensioni allo scenario principale]
   \item[Requisiti non funzionali]
   \item[Vincoli temporali]
  \end{description}

 \item[UC13] Gestione amministratori
  \begin{description}
   \item[Obiettivo] Permette ad un amministratore privilegiato di gestire le informazioni relative agli amministratori del sistema.
   \item[Categoria] Desiderato
   \item[Attori] Amministratore privilegiato
   \item[Precondizioni]
   \item[Evento scatenante] Accesso alla sistema di gestione degli amministratori
   \item[Postcondizioni in caso di successo] La lista degli amministratori ha subito correttamente le modifiche volute dall'amministratore privilegiato
   \item[Postcondizioni in caso di fallimento] Nessuna modifica apportata alla lista degli amministratori
   \item[Scenario principale di successo] :
    \begin{enumerate}
     \item INCLUDE "uc2: Autenticazione"
     \item FINCH\`E (le operazioni di modifica non sono terminate)
      \begin{enumerate}
       \item L'amministratore privilegiato seleziona un amministratore dalla lista.
       \item L'amministratore privilegiato modifica le informazioni dell'amministratore selezionato.
       \item Il sistema verifica la correttezza dell'operazione.
       \item Il sistema aggiorna il la lista degli amministratori.
      \end{enumerate}
    \end{enumerate}
   \item[Scenari alternativi]
   \item[Scenari eccezionali] : \\ 2.(d)E: Il sistema notifica all'amministratore un errore nell'operazione.
   \item[Estensioni allo scenario principale]
   \item[Requisiti non funzionali]
   \item[Vincoli temporali]
  \end{description}
\end{description} 

\section{Diagrammi di sequenza}
Una volta sistemati i casi d'uso, abbiamo creato i diagrammi robusti riguardanti le tre iterazioni. Questi ci hanno permesso di definire le iterazioni tra le varie parti del sistema e i casi d'uso stessi, per poter passare da una cosa completamente astratta come i casi d'uso ad una versione molto pi\`u concreta delle interazioni.

\begin{figure}[htp]
 \centering
 \includegraphics[width=0.9\textwidth,clip]{img/robusto1.eps}
 \hfill
 \includegraphics[width=0.9\textwidth,clip]{img/robusto2.eps}
 \hfill
 \includegraphics[width=0.9\textwidth,clip]{img/robusto3.eps}
 \caption{Diagrammi robusti}
 \label{robusti}
\end{figure}

Ottenuti i diarammi robusti (Figura \ref{robusti}) si pu\`o passare alla creazione della prima versione dei diagrammi di sequenza, senza le classi effettive che interagiranno, uno per ogni caso d'uso. Un esempio lo troviamo nella figura \ref{sdnoclass}. Ottenuti questi diagrammi di sequenza si pu\`o agevolmente passare a quelli veri.

\begin{figure}
 \centering
 %\resizebox{\textwidth}{!}{\rotatebox{90}{\includegraphics{img/UC4SqDiagramNoClass.eps}}}
 \includegraphics[width=\textwidth]{img/UC4SqDiagramNoClass.eps}
 \caption{UC4 Diagramma di sequenza senza classi}
 \label{sdnoclass}
\end{figure}

\begin{figure}
 \centering
 \includegraphics[width=\textwidth]{img/UC2SqDiagram.eps}
 \caption{UC2 Autenticazione - Diagramma di sequenza}
 \label{uc2sd}
\end{figure}

La figura \ref{uc2sd} presenta il diagramma di sequenza del caso d'uso inerente all'autenticazione. In questo diagramma si pu\`o notare una politica da noi effettuata. Tutta la logica viene implementata negli Entity Bean. Questo ci permette di avere in un unico punto tutte le politiche gestionali delle entit\`a coinvolte nelle operazioni descritte.

Dato che JBoss gestisce solo Web Service stateless, siamo stati costretti ad usare solo Session Bean stateless. Per questo motivo, per poter gestire le autenticazioni dal punto di vista del sistema si \`e scelto di associare ad ogni utente con il login effettuato, un token che identificasse univocamente la sua sessione di lavoro. Per comodit\`a il token (salvato nei cookie) viene usato dalle applicazioni web per gestire la sessione del cliente. L'entit\`a Authenticated rappresenta proprio l'associazione cliente, token e tempo di scadenza di quest'ultimo.

\begin{figure}
 \centering
 \includegraphics[width=\textwidth]{img/UC4SqDiagram.eps}
 \caption{UC4 Acquisto libro - Diagramma di sequenza}
 \label{uc4sd}
\end{figure}

La figura \ref{uc4sd} presenta il diagramma di sequenza del caso d'uso inerente all'acquisto dei libri. Questo caso d'uso ha creato molti problemi innanzitutto partendo dalla sua definizione. Mettersi d'accordo su quali fossero le sue estensione e inclusioni, o sulla necessit\`a di utilizzare alternative ha occupato tempo e fatiche.

Il risultato finale, come si pu\`o notare dal dettaglio del diagramma, prevede comunque possibili scelte. 

Innanzitutto per poter acquistare libri \`e necessario essere autenticati (e quindi risultare utenti registrati). Inoltre si inserisce il problema della ricerca dei testi, perch\`e questo \`e l'unico modo per poter aggiungere un libro al carrello. Oltre alla ricerca si deve avere la possibilit\`a di modificare il carrello in ogni momento. Infine si affronta il problema del checkout e del pagamento.

Il checkout non pu\`o essere eseguito su di un carrello vuoto.

Per quanto riguarda il pagamento, abbiamo deciso di trattare il \textit{Sistema di Pagamento} come un agente completamente esterno, un fornitore di servizi. Ci siamo comportati come se fosse presente uno \textit{SLA} (service-level agreement) che stabilisca i tempi di risposta del servizio di pagamento nei nostri confronti.

Pur non riportando il diagramma relativo, anche nel caso d'uso riguardante la conferma degli ordini (UC5) dobbiamo rapportarci con il \textit{Sistema di Consegna}. Per comodit\`a lo abbiamo trattato usando gli stessi criteri utilizzati col sistema di pagamento.

\section{Diagramma delle classi}
Una volta ottenuti tutti i diagrammi di sequenza \`e possibile iniziare l'implementazione del sistema, partendo dal diagramma delle classi. Utilizzando dei tool di modellazione (nel nostro caso Omondo), popolando il diagramma il tool crea gli scheletri delle classi all'interno del progetto.

\begin{figure}
 \centering
 \includegraphics[width=\textwidth]{img/archsw0904ClassDiagram.eps}
 \caption{Diagramma delle classi}
 \label{ClassDiagram}
\end{figure}

Per corretteza la figura \ref{ClassDiagram} presenta il diagramma delle classi nel suo intero. 

Abbiamo deciso di progettare i package utilizzando seguendo MVC. Le manipolazioni delle entit\`a del modello vengono effettuate dai controller. Infatti abbiamo un package che contiene il modello vero e proprio (model), con entit\`a e relazioni fra esse. Tutti i package che contengono le diverse interazioni sono chiamate controller. \\ Per esempio il package archsw0904.controller.registration contiene tutte le session bean e le interfacce necessarie per effettuare una registrazione all'interno del sistema. 

Tutta la logica \`e gestita nei controller, in questo se risulta necessario cambiare determinate politiche, tutte le modifiche rimangono circoscritte ai package direttamente interessati.

La figura \ref{modelai} rappresenta il package model del nostro sistema e come diagramma \`e pi\`u significativo. Model contiene le relazioni di ereditariet\`a e indirettamente mostra anche come sono state disposte le tabelle e le relazioni nel database.

Guardando il diagramma si pu\`o notare che nella classe Orders vi \`e un riferimento a ProfileClients. La duplicazione degli indirizzi \`e voluta, questo perch\`e nell'ordine va mantenuta una persistenza all'indirizzo a cui sono effettivamente stati mandati i libri, anche se all'interno del profilo del cliente questi possono variare nel tempo.

La classe Authenticated rappresenta esattamente il metodo da noi utilizzato per ottenere uno stato all'interno delle sessioni Stateless.

\begin{figure}
 \centering
 \includegraphics[width=\textwidth]{img/model-ai.eps}
 \caption{Diagramma delle calssi - package archsw0904.model}
 \label{modelai}
\end{figure}

\section{Diagramma degli stati}
Per spiegare la navigazione del sistema, abbiamo usato il diagramma degli stati che mostra l'interazione tra le varie pagine JSP.

\begin{figure}
 \centering
 \includegraphics[width=\textwidth]{img/StateDiagram.eps}
 \caption{Diagramma degli stati}
 \label{StateDiagram}
\end{figure}

La sezione in alto a destra permette di gestire l'autenticazione nel momento in cui dal catalogo si \`e deciso di aggiungere un libro al carrello pur non essendo ancora autenticati nel sistema.

Per quanto riguarda la parte in basso, ConfirmOrder non \`e  un JSP. Attualmente non \`e stato implementato il sistema di posta, per questo le notifiche via e-mail ai clienti sono dei TODO. ConfirmOrder si occuperebbe di segnalare ai clienti la conferma del pagamento (o la presenza di un problema), e, una volta ottenuto l'identificativo della spedizione (da parte del Delivery System) di comunicarlo al cliente interessato.

\section{Diagramma delle attivit\`a}
Un diagramma delle attivit\`a significativo \`e quello relativo all'autenticazione. Ricordo che nel nostro sistema tutte le sessioni sono stateless, per poter gestire una continuit\`a nelle azioni compiute dal cliente, abbiamo creato un servizio di autenticazione particolare. 

Per alcune pagine risulta necessario essere gi\`a autenticati nel sistema per potervi accedere, per questo nel caso l'accesso non sia gi\`a avvenuto bisogna mostrare la schermata di login prima di procedere nella visualizzazione della pagina desiderata.

\begin{figure}
 \centering
 \includegraphics[width=\textwidth]{img/loginActivityDiagram.eps}
 \caption{UC2 Autenticazione - Diagramma delle attivit\`a}
 \label{activity}
\end{figure}

Per questo abbiamo deciso di far direttamente richiesta alla pagina di login. A questa pagina viene passato un parametro in POST che indica la pagina a cui si vuole essere rediretti. Negli header della richiesta \`e presente un cookie che permette di capire se l'utente si \`e gi\`a loggato e ha fatto qualcosa negli ultimi 30 minuti (questo per simulare una sessione). La pagina di login riceve quindi 3 parametri: username, password e URL di reindirizzamento.

Se l'utente non ha una sessione attiva, viene mostrato il form di login (l'URL di reindirizzamento viene messo in un campo di form nascosto in modo che venga ritrasmesso) altrimenti le credenziali saranno ottenute mediante il token e la pagina di login controller\`a le credenziali del cliente. Se queste sono corrette, il cliente verr\`a rediretto alla pagina richiesta, altrimenti verr\`a mostrata nuovamente la form del login con un messaggio di errore.

\section{Diagramma del deploy}
Il nostro sistema prevede di avere un server per il bilanciamento del carico (con sopra Apache e mod\_jk) che ridirige il lavoro su N nodi presenti nel sistema. Questi nodi sono connessi tutti allo stesso database posto su un nodo differente.

Sia i browser che i WebService Client accedono solamente al bilanciatore del carico, che risulta essere l'unico punto di accesso al sistema.

Nel caso uno dei nodi interni cada, sar\`a il bilanciatore a ridistribuire il carico sui nodi disponibili.

\begin{figure}
 \centering
 \includegraphics[width=\textwidth]{img/deployment.eps}
 \caption{Diagramma del deploy}
 \label{deploy}
\end{figure}
 